from django.http import JsonResponse
from django.shortcuts import render, HttpResponse
from django.views import View


# Create your views here.

class ImageVerificationCode(View):
    """用户注册-图片验证码"""

    def get(self, request, image_code_id):
        # 1.拿到前端请求参数（image_code_id）
        # 2.生成图片验证码（验证码值,图片）
        from libs.captcha.captcha import captcha
        img_value, img = captcha.generate_captcha()  # 生成图片验证码，返回 图片验证码值和图片验证码二进制
        # 3.保存到redis数据库
        from django_redis import get_redis_connection
        #     3.1 获得redis连接
        redis_cli = get_redis_connection('imageCode')  # 指定redis缓存
        #     3.2 调用redis的方法保存定时字符串（方法与redis命令同名）
        # setex(key,time,value)
        redis_cli.setex(image_code_id, 60 * 2, img_value)
        # 4.给前端返回图片验证码的图片（图片是二进制传输）
        # content_type 内容类型    大类/小类  例如：image/jpeg
        return HttpResponse(img, content_type='image/jpeg')

class SMSCodeView(View):
    """用户注册-短信验证码发送"""
    def get(self,request,mobile):
        # 1.拿到前端参数
        image_code=request.GET.get('image_code') #图形验证码
        image_code_id=request.GET.get('image_code_id') #图形验证码id

        # 2.校验图片验证码,判断是否频繁请求发送短信（redis）
        from django_redis import get_redis_connection
        redis_cli=get_redis_connection('imageCode')
        if redis_cli.get('sms_flag_%s'%mobile) is not None:#判断是否频繁发送短信
            return JsonResponse({"code": 401, "errmsg": '上一条短信还未过期，请继续使用上一条短信，验证码不要频繁发送短信！'})
        if redis_cli.get(image_code_id) is None: #判断验证码是否过期
            return JsonResponse({"code":400,"errmsg":'图片验证码过期'})
        if image_code.lower()!=redis_cli.get(image_code_id).decode().lower(): #判断图片验证码是否正确
            return JsonResponse({"code":400,"errmsg":'图片验证码错误'})

        # 3.生成短信验证码
        import random
        sms_code=random.randint(100000,999999)

        # 4.保存短信验证码（redis，管道）
        pl=redis_cli.pipeline() #1 创建管道
        pl.setex(mobile,60*15,sms_code) #2 添加命令
        #设置一个flag，避免频繁发送短信,值随便设置
        pl.setex('sms_flag_%s'%mobile,60*15,1)
        pl.execute() #3 统一提交命令

        # 5.发送短信验证码
        # from libs.yuntongxun.smsbao import SmsBaoCode #短信宝
        # my_sms=SmsBaoCode(sms_code,mobile) #返回字符串
        # from libs.yuntongxun.sms import CCP #容联云
        # my_sms=CCP().send_template_sms(mobile, [sms_code, 5], 1)
        from celery_tasks.sms.tasks import celerySmsCode
        celerySmsCode.delay(sms_code,mobile) #异步发送短信

        # 6.响应结果
        # if my_sms not in ('短信发送成功',0):
        #     return JsonResponse({"code":400,"errmsg":my_sms})

        # return JsonResponse({"code":0,"errmsg":my_sms})
        return JsonResponse({"code":0,"errmsg":'验证码发送成功'})

